$Description$
一个餐厅在相继的$N$天里,每天需用的餐巾数不尽相同。假设第$i$天需要 $r_i$块餐巾$(i=1,2,\cdots ,N)$。餐厅可以购买新的餐巾,每块餐巾的费用为$p$分;或者把旧餐巾送到快洗部,洗一块需$m$天,其费用为$f$分;或者送到慢洗部,洗一块需$n$天$(n>m)$,其费用为$s$分$(s<f)$。
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
试设计一个算法为餐厅合理地安排好$N$天中餐巾使用计划,使总的花费最小。编程找出一个最佳餐巾使用计划。
$Solution$
考虑费用流
其中$x \xrightarrow{a, b} y$代表从$u$向$v$连接一条流量为$x$,费用为$y$的有向边。
首先,我们将每天进行拆点,将一天拆成早上$a_1$和晚上$a_2$,每天晚上会收到脏餐巾(来源:当天早上用完的餐巾,在这道题中可理解为从源点$s$获得),每天早上又会受到干净的餐巾(来源:购买、快洗店、慢洗店)。
从源点$s$向每一天晚上连一条流量为当天所用餐巾$r_i$,费用为$0$的边,表示每天晚上$a_2$从源点$s$获得条脏餐巾。(由于我们把脏毛巾和干净毛巾看作不同的东西,所以不能从$a_1$转移过来),即$S \xrightarrow{r_i, 0} a_2$
每天早上要使用$r_i$块干净餐巾。所以连接$a_1 \xrightarrow{r_i, 0} T$
每天早上可以买任意多块餐巾。所以连接$S \xrightarrow{+\infty, p}$
快洗部用$m$天将任意多块餐巾洗干净。所以连接$i \xrightarrow{+\infty, f} (i + m)$
慢洗部用$n$天将任意多块餐巾洗干净。所以连接$i \xrightarrow{+\infty, s} (i + n)$。
$Code$
1 |
|